package com.facebook.android;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.Vector;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;


import android.app.Dialog;
import android.os.Bundle;
import android.text.SpannableString;
import android.text.style.UnderlineSpan;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import android.widget.CompoundButton.OnCheckedChangeListener;
import android.widget.ListView;
import android.widget.TabHost;
import android.widget.TabHost.TabSpec;
import android.widget.Toast;


public class FieldsConnectionsDialog extends Dialog {
    
    private final int TAB_HEIGHT = 50;
    
    private Button mGetFieldsButton;
    private ListView fieldsList, connectionsList;
    private BaseAdapter fieldsAdapter, connectionsAdapter;
	
	private GraphExplorer explorerActivity;
	
	protected Vector<String> fieldsVector;
	private ArrayList<JSONObject> fieldsArray;
	private ArrayList<String> connectionsArray;
	
	public FieldsConnectionsDialog(GraphExplorer explorerActivity, JSONObject metadata) {
        super(explorerActivity);
    	this.explorerActivity = explorerActivity;
    	
    	/*
    	 * Sort the fields and connections
    	 */
    	try {
    		sortFields(metadata.getJSONArray("fields"));
    	    sortConnections(metadata.getJSONObject("connections").names());
		} catch (JSONException e) {
			Toast.makeText(explorerActivity.getBaseContext(), "Fields/Connections could not be fetched.", Toast.LENGTH_SHORT).show();
			
		}
		
        setTitle(explorerActivity.getString(R.string.fields_and_connections));
        fieldsVector = new Vector<String>();
    }

	/*
	 * Sort fields which are returned as JSONObject in the JSONArray
	 */
	
	public void sortFields(JSONArray jsonFieldsArray) {
		this.fieldsArray = new ArrayList<JSONObject>(jsonFieldsArray.length());
		for (int i=0; i<jsonFieldsArray.length(); i++){ 
			try {
				this.fieldsArray.add(jsonFieldsArray.getJSONObject(i));
			} catch (JSONException e) {
				e.printStackTrace();
			} 
		}
		
		Collections.sort(this.fieldsArray, new Comparator<JSONObject>() {
	        @Override
	        public int compare(JSONObject object1, JSONObject object2) {
	            try {
					return object1.getString("name").compareToIgnoreCase(object2.getString("name"));
				} catch (JSONException e) {
					e.printStackTrace();
				}
				return 0;
	        }
	    });;
	}
	
	/*
	 * Sort the Connections returned in the JSONArray
	 */
	
	public void sortConnections(JSONArray jsonConnectionsArray) {
		this.connectionsArray = new ArrayList<String>(jsonConnectionsArray.length());
		for (int i=0; i<jsonConnectionsArray.length(); i++){ 
			try {
				this.connectionsArray.add(jsonConnectionsArray.get(i).toString());
			} catch (JSONException e) {
				e.printStackTrace();
			} 
		}
		Collections.sort(this.connectionsArray);
	}
	
	/*
	 * Layout the dialog
	 */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        setContentView(R.layout.fields_connections_list);
        LayoutParams params = getWindow().getAttributes(); 
        params.width = LayoutParams.FILL_PARENT; 
        params.height = LayoutParams.FILL_PARENT; 
        getWindow().setAttributes((android.view.WindowManager.LayoutParams) params);
        
        
        fieldsList = (ListView)findViewById(R.id.fields_list);
        connectionsList = (ListView)findViewById(R.id.connections_list);
        
        fieldsAdapter = new FieldsListAdapter();
        if(this.fieldsArray == null) {
        	fieldsList.setAdapter(new ArrayAdapter<String>(explorerActivity,
    				android.R.layout.simple_list_item_1, new String[]{"No fields available"}));
        } else {
        	fieldsList.setAdapter(fieldsAdapter);
        }
        
        connectionsAdapter = new ConnectionsListAdapter();
        if(this.connectionsArray == null) {
        	connectionsList.setAdapter(new ArrayAdapter<String>(explorerActivity,
    				android.R.layout.simple_list_item_1, new String[]{"No connections available"}));
        } else {
        	connectionsList.setAdapter(connectionsAdapter);
        }
        
        TabHost tabHost=(TabHost)findViewById(R.id.tabHost);
        tabHost.setup();
        
        TabSpec spec1=tabHost.newTabSpec("Tab 1");
        spec1.setIndicator(explorerActivity.getString(R.string.fields));
        spec1.setContent(R.id.fields_layout);
        
        TabSpec spec2=tabHost.newTabSpec("Tab 2");
        spec2.setIndicator(explorerActivity.getString(R.string.connections));
        spec2.setContent(R.id.connections_list);
        
        tabHost.addTab(spec1);
        tabHost.addTab(spec2);
        tabHost.setCurrentTab(0);
        tabHost.getTabWidget().getChildAt(0).getLayoutParams().height = TAB_HEIGHT;
        tabHost.getTabWidget().getChildAt(1).getLayoutParams().height = TAB_HEIGHT;
        
        mGetFieldsButton = (Button) findViewById(R.id.get_fields_button);
		
        mGetFieldsButton.setOnClickListener(new View.OnClickListener() {
        	public void onClick(View v) {
        		/*
        		 * Source Tag:
        		 */
        		FieldsConnectionsDialog.this.dismiss();
        		if(!fieldsVector.isEmpty()) {
        			explorerActivity.getFields(fieldsVector);
        		} else {
        			Toast.makeText(explorerActivity.getBaseContext(), "No Fields selected.", Toast.LENGTH_SHORT).show();
        		}
        	}
        });
        
        connectionsList.setOnItemClickListener(new OnItemClickListener() {
			public void onItemClick(AdapterView<?> arg0, View v, int position, long arg3) {
    			FieldsConnectionsDialog.this.dismiss();
    			explorerActivity.getConnection(connectionsArray.get(position));
            }
        });
    }
    
    /**
     * Definition of the list adapter
     */
	public class FieldsListAdapter extends BaseAdapter {
		private LayoutInflater mInflater;
		boolean []isChecked;
		
		public FieldsListAdapter() {
			mInflater = LayoutInflater.from(explorerActivity.getBaseContext());
			isChecked = new boolean[fieldsArray.size()];
		}
		
		@Override
		public int getCount() {
			return fieldsArray.size();
		}
		
		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}
		
		@Override
		public View getView(final int position, View convertView, ViewGroup parent) {
			
			View hView = convertView;
			ViewHolder holder;
			JSONObject fieldObject = null;
			fieldObject = (JSONObject)fieldsArray.get(position);
			
			if(hView == null) {
				hView = mInflater.inflate(R.layout.fields_item, null);
				holder = new ViewHolder();
				holder.checkbox = (CheckBox) hView.findViewById(R.id.fields_checkbox);
				holder.fieldsInfo = (TextView) hView.findViewById(R.id.fields_info);
				hView.setTag(holder);
			} else {
				holder = (ViewHolder) hView.getTag();
			}
			try {
				holder.checkbox.setText(fieldObject.getString("name"));
			} catch (JSONException e) {
				holder.checkbox.setText("");
			}
			try {
				holder.fieldsInfo.setText(fieldObject.getString("description"));
			} catch (JSONException e) {
				holder.fieldsInfo.setText("");
			}
			holder.checkbox.setId(position);
			holder.checkbox.setChecked(isChecked[position]);
			holder.checkbox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
				@Override
				public void onCheckedChanged(CompoundButton button, boolean checked) {
					isChecked[button.getId()] = checked;
					String field = button.getText().toString();
					if(checked) {
						fieldsVector.add(field);
					} else if (fieldsVector.contains(field)) {
						fieldsVector.remove(field);
					}
				}
			});
			
			return hView;
		}
	}
	
	class ViewHolder {
		CheckBox checkbox;
		TextView fieldsInfo;
	}
	
    /**
     * Definition of the list adapter
     */
	public class ConnectionsListAdapter extends BaseAdapter {
		private LayoutInflater mInflater;
		
		public ConnectionsListAdapter() {
			mInflater = LayoutInflater.from(explorerActivity.getBaseContext());
		}
		
		@Override
		public int getCount() {
			return connectionsArray.size();
		}
		
		@Override
		public Object getItem(int position) {
			return null;
		}

		@Override
		public long getItemId(int position) {
			return 0;
		}
		
		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			
			View hView = convertView;
			TextView connection;
			if(hView == null) {
				hView = mInflater.inflate(R.layout.connection_item, null);
				connection = (TextView) hView.findViewById(R.id.connection_name);
				hView.setTag(connection);
			} else {
				connection = (TextView) hView.getTag();
			}
			SpannableString name;
			name = new SpannableString(connectionsArray.get(position));
			name.setSpan(new UnderlineSpan(), 0, name.length(), 0);
			connection.setText(name);
			return hView;
		}
	}
}

